#include<vector>
#include<unordered_set>
#include<unordered_map>
using namespace std;

class Solution {
public:
    int fourSumCount(vector<int>& A, vector<int>& B, vector<int>& C, vector<int>& D) {
        unordered_map<int,int> map;
        for (int i = 0; i < A.size(); ++i) {
            for (int j = 0; j < B.size(); ++j) {
                int tmp = -(A[i] + B[j]);
                if (map.find(tmp) != map.end())
                    ++map[tmp];
                else
                    map[tmp] = 1;
            }
        }
        int res = 0;
        for (int i = 0; i < C.size(); i++) {
            for (int j = 0; j < D.size(); ++j) {
                int tmp = C[i] + D[j];
                if (map.find(tmp) != map.end())
                    res += map[tmp];
            }
        }
        return res;
    }
};

//class Solution {
//public:
//    int fourSumCount(vector<int>& A, vector<int>& B, vector<int>& C, vector<int>& D) {
//        unordered_multiset<int> set;
//        for (int i = 0; i < A.size(); ++i) {
//            for (int j = 0; j < B.size(); ++j) {
//                set.insert(-(A[i] + B[j]));
//            }
//        }
//        int res = 0;
//        for (int i = 0; i < C.size(); i++) {
//            for (int j = 0; j < D.size(); ++j) {
//                res += set.count(C[i] + D[j]);
//            }
//        }
//        return res;
//    }
//};

//class Solution {
//public:
//    int fourSumCount(vector<int>& A, vector<int>& B, vector<int>& C, vector<int>& D) {
//        unordered_multiset<int> set;
//        for (int i = 0; i < D.size(); ++i)
//            set.insert(-D[i]);
//        int res = 0;
//        for (int i = 0; i < A.size(); ++i) {
//            for (int j = 0; j < B.size(); ++j) {
//                for (int k = 0; k < C.size(); ++k) {
//                    res += set.count(A[i] + B[j] + C[k]);
//                }
//            }
//        }
//        return res;
//    }
//};